main() {
  var father = Father();
  print(father.money);
  father.pay(20);
  print(father.money);

  var child = Children();
  // 继承自父亲money和pay
  print(child.money);
  child.pay(20);
  print(child.money);

  // 测试IPHONE打电话
  var iphone17 = IPHONE('red');
  iphone17.call();
  print(iphone17.price);
  print(iphone17.color);

  var star = SuperStar('老潘',99);
  print({star.uname,star.age,star.gender});
  star.sayHi();

}

class Father {
  num money = 9999.99;
  pay(price) {
    this.money -= price;
  }
}

// 继承：extends 从父类继承属性和方法，及时自己没有，继承以后自己就用了
class Children extends Father{
}
// 基本的一个类：
class Phone {
   String color = '';

   call(){
    print('打电话');
   }
   // 父类的构造函数-需要通过子类进行传递(子类的构造函数进行传值)
   Phone(this.color);
}
// 除了可以继承原有的属性和方法，还可以新增属性和方法
class IPHONE extends Phone {
   // super就是父类
   //子类构造函数的值给到父类构造函数 ，需要将这个值给父类的哪个属性，就调用super的哪个属性
    IPHONE(super.color);
    num price = 9999;
}
// 测试带构造函数的类的继承
// 技巧：父类该怎么写就怎么写
class Star {
    String uname = '';
    int age = 0;
    String gender = '男';
    Star(this.uname,this.age);
    sayHi(){
      print('我是star');
    }
}
// 技巧：子类只需要将this替换成super
class SuperStar extends Star {
   SuperStar(super.uname,super.age);
   // 这不叫属性重写，这叫属性避让，实例化对象访问其实是子类的属性，父类的属性因为同名做了避让
   String gender = '女';
   // 函数的重写：父类已经有这个方法了，但是我不需要，我需要按照自己的方法来
   // @override加不加都可以，但是为了代码的可读性，加上之后明确父类就包含这个方法了，重写只能重写方法，不能重写属性
   @override
   sayHi(){
      print('我是superStar');
   }
}
